package com.tomato.zip.service;

import com.tomato.zip.enums.ZipType;
import com.tomato.zip.errors.ZipErrorType;
import com.tomato.zip.exception.ZipException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;

import java.io.File;
import java.util.List;

import static java.text.MessageFormat.format;

/**
 * 压缩工具接口 所有的压缩服务都必须实现该接口
 */
public interface BaseZip {

    Logger log = LoggerFactory.getLogger(BaseZip.class);

    /**
     * 压缩包类型
     *
     * @return
     */
    ZipType getZipType();

    /**
     * 创建压缩包
     *
     * @param zip      压缩包文件
     * @param password 压缩包密码,如果没有密码直接将该参数设为 null
     * @param files    被压缩的文件
     */
    void compress(File zip, String password, List<File> files);

    /**
     * 解压所有文件
     *
     * @param zip      要解压的文件
     * @param password 压缩包密码,如果没有密码则直接传为null
     * @param path     解压的文件要存放的路径
     */
    void extractAll(File zip, String password, String path);


    /**
     * 解压指定的文件
     *
     * @param zip      压缩包文件
     * @param fileName 要解压的文件名
     * @param password 压缩包密码，如果没有直接设置为null
     * @param path     解压后的文件存放的路径
     */
    void extractFile(File zip, String fileName, String password, String path);

    /**
     * 往压缩包里添加文件
     *
     * @param zip      压缩包文件
     * @param password 密码,如果没有密码则将该参数的值直接设为null
     * @param file     要添加的版本
     */
    void addFile(File zip, String password, File file);

    /**
     * 判断压缩文件的后缀名是否合法
     *
     * @param file
     * @return
     */
    default Boolean isLegal(File file) {
        return file.getName().endsWith(getZipType().getDescription());
    }

    /**
     * 判断要压缩的文件是否存在
     *
     * @param files
     * @return
     */
    default void fileExists(List<File> files) {
        if (CollectionUtils.isEmpty(files)) {
            throw new ZipException(ZipErrorType.COMPRESS_FILE_NULL);
        }
        for (File file : files) {
            if (!file.exists()) {
                // 文件不存在则抛异常
                log.error("文件:{},不存在，请检查文件路径是否正确", file.getName());
                throw new ZipException(format("文件:{0},不存在，请检查文件路径是否正确", file.getName()));
            }
        }
    }
}
